Add Skeleton Loaders for Pages During Data Fetch - #22
Conversation
|
@muktijain is attempting to deploy a commit to the Yash Pouranik's projects Team on Vercel. A member of the Team first needs to authorize it. |
📝 WalkthroughWalkthroughAdds inline SkeletonLoader components and shimmer/CSS to Changes
Sequence Diagram(s)(omitted — changes are UI-focused and do not introduce multi-component sequential flows requiring a diagram) Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related issues
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Fix all issues with AI agents
In @frontend/src/pages/Analytics.jsx:
- Around line 104-106: The render can crash when the API fails because loading
becomes false but data stays null; update the component to track an error state
(e.g., add error / setError alongside data and loading), set error = true inside
the fetch catch block, and then change the render branch that currently shows
SkeletonLoader to also handle error/null data by returning an error UI or
fallback (e.g., if (error || !data) show an error message or fallback
component). Alternatively (or in addition), guard individual accesses by using
optional chaining for properties like data?.totalRequests, data?.storage,
data?.someField when rendering to prevent runtime throws; reference the existing
variables data, loading, SkeletonLoader and the fetch/catch logic to implement
these changes.
In @frontend/src/pages/Dashboard.jsx:
- Around line 302-306: The @keyframes shimmer in Dashboard.jsx ends with left:
50%, causing a shorter sweep than Analytics.jsx; update the Dashboard @keyframes
shimmer final keyframe to match Analytics by changing the 100% rule from left:
50% to left: 150% so both pages use the same full-sweep shimmer animation (look
for the @keyframes shimmer block in Dashboard.jsx and mirror the final left
value used in Analytics.jsx).
- Around line 273-284: There are two conflicting `.skeleton` rules; consolidate
them into one by removing the duplicate and merging properties (keep `position:
relative;`, `overflow: hidden;` and a single `background` value — prefer
`rgba(255,255,255,0.05)` since it currently overrides the earlier value); ensure
`.skeleton-text { border-radius: 2px; }` stays separate and unchanged so only
one `.skeleton` selector remains with all necessary styles.
🧹 Nitpick comments (3)
frontend/src/pages/Analytics.jsx (2)
35-68: MoveSkeletonLoaderoutside the component to avoid recreation on every render.Defining
SkeletonLoaderas a function insideAnalyticsmeans it's recreated on each render. Since it has no dependencies on component state or props, extract it outside or memoize it.♻️ Suggested refactor
+const SkeletonLoader = () => ( + <div className="container" style={{ maxWidth: '1200px', margin: '0 auto', paddingBottom: '4rem' }}> + {/* Stats Cards Skeleton */} + <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '1.5rem', marginBottom: '2rem' }}> + {[1,2,3].map(i => ( + <div key={i} className="card" style={{ padding: '1rem', position: 'relative' }}> + <div className="skeleton skeleton-text" style={{ width: '40%', height: '16px' }} /> + <div className="skeleton skeleton-text" style={{ width: '60%', height: '36px', marginTop: '8px' }} /> + <div className="skeleton skeleton-text" style={{ width: '100%', height: '6px', marginTop: '12px' }} /> + </div> + ))} + </div> + {/* ... rest of skeleton */} + </div> +); + export default function Analytics() { // ... - const SkeletonLoader = () => ( - // ... - );
290-313: Skeleton CSS is duplicated across pages.The
.skeletonand shimmer animation styles are repeated in bothAnalytics.jsxandDashboard.jsx. Consider extracting these to a shared CSS file or a reusable component to reduce duplication and ensure consistency.Additionally, there's a subtle inconsistency:
Dashboard.jsxanimates toleft: 50%while this file animates toleft: 150%, which will produce different shimmer effects.frontend/src/pages/Dashboard.jsx (1)
33-50: MoveSkeletonLoaderoutside the component.Same issue as in
Analytics.jsx: definingSkeletonLoaderinsideDashboardcauses unnecessary recreation on every render. Extract it to module scope since it doesn't depend on any props or state.As per the relevant snippets,
Database.jsxalso has aSkeletonLoader. Consider creating a shared skeleton component library (e.g.,components/skeletons/) to promote reuse and reduce duplication across pages.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
backend/package-lock.jsonis excluded by!**/package-lock.jsonpackage-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (2)
frontend/src/pages/Analytics.jsxfrontend/src/pages/Dashboard.jsx
🧰 Additional context used
🧬 Code graph analysis (2)
frontend/src/pages/Analytics.jsx (2)
frontend/src/pages/Dashboard.jsx (1)
SkeletonLoader(33-50)frontend/src/pages/Database.jsx (1)
SkeletonLoader(254-262)
frontend/src/pages/Dashboard.jsx (3)
frontend/src/pages/Analytics.jsx (1)
SkeletonLoader(35-68)frontend/src/pages/Database.jsx (1)
SkeletonLoader(254-262)frontend/src/pages/Login.jsx (1)
isLoading(11-11)
🔇 Additional comments (1)
frontend/src/pages/Dashboard.jsx (1)
128-129: LGTM!The conditional rendering logic correctly handles loading, empty, and populated states in a clean ternary chain.
| {loading ? ( | ||
| <SkeletonLoader /> | ||
| ) : ( |
There was a problem hiding this comment.
Potential crash if API call fails: data remains null but loading becomes false.
When the fetch fails, loading is set to false in the finally block (line 26), but data stays null. The rendered content then attempts to access data.totalRequests, data.storage, etc. (lines 120, 133, 136, etc.), causing a runtime error.
🐛 Suggested fix: add error state or null guard
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
+const [error, setError] = useState(null);
const [refreshing, setRefreshing] = useState(false);
const fetchData = useCallback(async () => {
try {
setRefreshing(true);
+ setError(null);
const res = await axios.get(`${API_URL}/api/projects/${projectId}/analytics`, {
headers: { Authorization: `Bearer ${token}` }
});
setData(res.data);
} catch (err) {
console.error(err);
+ setError(err);
} finally {
setLoading(false);
setRefreshing(false);
}
}, [projectId, token]);Then in the render:
-{loading ? (
+{loading ? (
<SkeletonLoader />
+) : error ? (
+ <div>Failed to load analytics. Please try again.</div>
) : (🤖 Prompt for AI Agents
In @frontend/src/pages/Analytics.jsx around lines 104 - 106, The render can
crash when the API fails because loading becomes false but data stays null;
update the component to track an error state (e.g., add error / setError
alongside data and loading), set error = true inside the fetch catch block, and
then change the render branch that currently shows SkeletonLoader to also handle
error/null data by returning an error UI or fallback (e.g., if (error || !data)
show an error message or fallback component). Alternatively (or in addition),
guard individual accesses by using optional chaining for properties like
data?.totalRequests, data?.storage, data?.someField when rendering to prevent
runtime throws; reference the existing variables data, loading, SkeletonLoader
and the fetch/catch logic to implement these changes.
| .skeleton { | ||
| background: rgba(255, 255, 255, 0.03); | ||
| } | ||
|
|
||
| .skeleton-text { | ||
| border-radius: 2px; | ||
| } | ||
| .skeleton { | ||
| position: relative; | ||
| overflow: hidden; | ||
| background: rgba(255,255,255,0.05); | ||
| } |
There was a problem hiding this comment.
Duplicate .skeleton selector with conflicting values.
The .skeleton class is defined twice with different background values. The second definition (line 283: rgba(255,255,255,0.05)) overwrites the first (line 274: rgba(255,255,255,0.03)). Consolidate into a single rule.
🔧 Suggested fix
- .skeleton {
- background: rgba(255, 255, 255, 0.03);
- }
-
- .skeleton-text {
- border-radius: 2px;
- }
- .skeleton {
- position: relative;
- overflow: hidden;
- background: rgba(255,255,255,0.05);
- }
+ .skeleton {
+ position: relative;
+ overflow: hidden;
+ background: rgba(255,255,255,0.05);
+ border-radius: 4px;
+ }
+
+ .skeleton-text {
+ border-radius: 2px;
+ }📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| .skeleton { | |
| background: rgba(255, 255, 255, 0.03); | |
| } | |
| .skeleton-text { | |
| border-radius: 2px; | |
| } | |
| .skeleton { | |
| position: relative; | |
| overflow: hidden; | |
| background: rgba(255,255,255,0.05); | |
| } | |
| .skeleton { | |
| position: relative; | |
| overflow: hidden; | |
| background: rgba(255,255,255,0.05); | |
| border-radius: 4px; | |
| } | |
| .skeleton-text { | |
| border-radius: 2px; | |
| } |
🤖 Prompt for AI Agents
In @frontend/src/pages/Dashboard.jsx around lines 273 - 284, There are two
conflicting `.skeleton` rules; consolidate them into one by removing the
duplicate and merging properties (keep `position: relative;`, `overflow:
hidden;` and a single `background` value — prefer `rgba(255,255,255,0.05)` since
it currently overrides the earlier value); ensure `.skeleton-text {
border-radius: 2px; }` stays separate and unchanged so only one `.skeleton`
selector remains with all necessary styles.
✅ Addressed in commit 551b376
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
chk ur pr live here - https://ur-backend-git-fork-muktijain-skeleton-yash-pouraniks-projects.vercel.app/project/692a0f26dfde95b8fcbf235f Thanku @muktijain for the PR i looked the new UI its really very good. one last thing if u have time or u could do- just let me know if u are available, if yes then do, and if not then i will merge it. All the best
|
|
I will do it by tomorrow.
…On Mon, 12 Jan, 2026, 11:59 pm Yash Pouranik, ***@***.***> wrote:
*yash-pouranik* left a comment (geturbackend/urBackend#22)
<#22 (comment)>
chk ur pr live here -
https://ur-backend-git-fork-muktijain-skeleton-yash-pouraniks-projects.vercel.app/project/692a0f26dfde95b8fcbf235f
Thanku @muktijain <https://github.com/muktijain> for the PR i looked the
new UI its really very good.
one last thing if u have time or u could do-
same skeleton or for the overview page to?? so that i dont have to create
a new issue for this small change?
just let me know if u are available, if yes then do, and if not then i
will merge it.
All the best
image.png (view on web)
<https://github.com/user-attachments/assets/de5fc335-d123-4d94-92bb-e538e9ce21ff>
—
Reply to this email directly, view it on GitHub
<#22 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/BVOXWVVRO2QU7OQLJO7FEYL4GPRYNAVCNFSM6AAAAACROBIAE6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTOMZZHEYTANRXHA>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@urBackend/backend/.env`:
- Around line 1-21: This .env file containing secrets was committed accidentally
and is unrelated to the frontend skeleton-loader work; remove it from the PR,
replace it with a safe template, and ensure it is ignored: delete
urBackend/backend/.env from the branch (git rm), add a
urBackend/backend/.env.example with the same keys but placeholder values, add
urBackend/backend/.env to .gitignore, and update README to instruct developers
to copy .env.example to .env and populate secrets locally; if backend config
truly belongs in a separate change, move these changes into a dedicated PR after
applying the above.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (295)
urBackend/backend/node_modules/.bin/baseline-browser-mappingis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/baseline-browser-mapping.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/baseline-browser-mapping.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/bcryptis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/bcrypt.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/bcrypt.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/browserslistis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/browserslist.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/browserslist.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/cross-envis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/cross-env-shellis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/cross-env-shell.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/cross-env-shell.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/cross-env.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/cross-env.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/esparseis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/esparse.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/esparse.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/esvalidateis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/esvalidate.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/esvalidate.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/globis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/glob.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/glob.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/import-local-fixtureis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/import-local-fixture.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/import-local-fixture.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/jestis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/jest.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/jest.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/js-yamlis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/js-yaml.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/js-yaml.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/jsescis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/jsesc.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/jsesc.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/json5is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/json5.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/json5.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/mimeis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/mime.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/mime.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/mkdirpis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/mkdirp.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/mkdirp.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/napi-postinstallis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/napi-postinstall.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/napi-postinstall.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/node-whichis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/node-which.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/node-which.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/parseris excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/parser.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/parser.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/semveris excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/semver.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/semver.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/update-browserslist-dbis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/update-browserslist-db.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/update-browserslist-db.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/uuidis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/uuid.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/.bin/uuid.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/.package-lock.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/code-frame/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/code-frame/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/code-frame/lib/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/code-frame/lib/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/code-frame/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/corejs2-built-ins.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/corejs3-shipped-proposals.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/data/corejs2-built-ins.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/data/corejs3-shipped-proposals.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/data/native-modules.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/data/overlapping-plugins.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/data/plugin-bugfixes.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/data/plugins.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/native-modules.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/overlapping-plugins.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/plugin-bugfixes.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/compat-data/plugins.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/cache-contexts.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/cache-contexts.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/caching.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/caching.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/config-chain.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/config-chain.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/config-descriptors.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/config-descriptors.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/configuration.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/configuration.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/import.cjsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/import.cjs.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/index-browser.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/index-browser.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/module-types.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/module-types.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/package.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/package.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/plugins.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/plugins.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/types.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/types.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/files/utils.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/files/utils.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/full.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/full.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/helpers/config-api.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/helpers/config-api.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/helpers/deep-array.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/helpers/deep-array.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/helpers/environment.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/helpers/environment.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/item.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/item.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/partial.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/partial.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/pattern-to-regex.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/pattern-to-regex.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/plugin.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/plugin.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/printer.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/printer.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/resolve-targets-browser.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/resolve-targets-browser.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/resolve-targets.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/resolve-targets.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/util.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/util.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/validation/option-assertions.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/validation/option-assertions.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/validation/options.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/validation/options.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/validation/plugins.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/validation/plugins.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/config/validation/removed.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/config/validation/removed.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/errors/config-error.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/errors/config-error.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/errors/rewrite-stack-trace.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/errors/rewrite-stack-trace.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/gensync-utils/async.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/gensync-utils/async.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/gensync-utils/fs.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/gensync-utils/fs.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/gensync-utils/functional.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/gensync-utils/functional.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/parse.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/parse.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/parser/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/parser/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/parser/util/missing-plugin-helper.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/tools/build-external-helpers.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/tools/build-external-helpers.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transform-ast.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transform-ast.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transform-file-browser.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transform-file-browser.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transform-file.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transform-file.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transform.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transform.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/block-hoist-plugin.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/block-hoist-plugin.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/file/babel-7-helpers.cjsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/file/babel-7-helpers.cjs.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/file/file.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/file/file.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/file/generate.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/file/generate.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/file/merge-map.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/file/merge-map.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/normalize-file.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/normalize-file.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/normalize-opts.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/normalize-opts.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/plugin-pass.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/plugin-pass.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/transformation/util/clone-deep.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/transformation/util/clone-deep.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/lib/vendor/import-meta-resolve.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/lib/vendor/import-meta-resolve.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/core/node_modules/.bin/semveris excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/.bin/semver.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/.bin/semver.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/semver/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/semver/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/semver/bin/semver.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/semver/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/semver/range.bnfis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/node_modules/semver/semver.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/src/config/files/index-browser.tsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/src/config/files/index.tsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/src/config/resolve-targets-browser.tsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/src/config/resolve-targets.tsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/src/transform-file-browser.tsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/core/src/transform-file.tsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/buffer.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/buffer.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/base.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/base.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/classes.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/classes.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/deprecated.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/deprecated.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/expressions.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/expressions.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/flow.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/flow.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/jsx.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/jsx.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/methods.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/methods.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/modules.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/modules.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/statements.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/statements.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/template-literals.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/template-literals.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/types.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/types.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/generators/typescript.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/generators/typescript.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/node/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/node/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/node/parentheses.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/node/parentheses.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/node/whitespace.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/node/whitespace.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/printer.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/printer.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/source-map.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/source-map.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/lib/token-map.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/generator/lib/token-map.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/generator/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/debug.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/debug.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-compilation-targets/lib/filter-items.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/filter-items.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-compilation-targets/lib/index.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/index.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-compilation-targets/lib/options.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/options.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-compilation-targets/lib/pretty.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/pretty.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-compilation-targets/lib/targets.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/targets.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-compilation-targets/lib/utils.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/lib/utils.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/.bin/semveris excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/.bin/semver.cmdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/.bin/semver.ps1is excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/bin/semver.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/range.bnfis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/semver.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-compilation-targets/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-globals/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-globals/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-globals/data/browser-upper.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-globals/data/builtin-lower.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-globals/data/builtin-upper.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-globals/package.jsonis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-module-imports/LICENSEis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-module-imports/README.mdis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-module-imports/lib/import-builder.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-module-imports/lib/import-builder.js.mapis excluded by!**/node_modules/**,!**/*.mapurBackend/backend/node_modules/@babel/helper-module-imports/lib/import-injector.jsis excluded by!**/node_modules/**urBackend/backend/node_modules/@babel/helper-module-imports/lib/import-injector.js.mapis excluded by!**/node_modules/**,!**/*.map
📒 Files selected for processing (1)
urBackend/backend/.env
🧰 Additional context used
🪛 dotenv-linter (4.0.0)
urBackend/backend/.env
[warning] 3-3: [UnorderedKey] The NODE_ENV key should go before the PORT key
(UnorderedKey)
[warning] 10-10: [UnorderedKey] The ENCRYPTION_KEY key should go before the JWT_SECRET key
(UnorderedKey)
[warning] 11-11: [UnorderedKey] The API_KEY_SALT key should go before the ENCRYPTION_KEY key
(UnorderedKey)
[warning] 15-15: [UnorderedKey] The SUPABASE_KEY key should go before the SUPABASE_URL key
(UnorderedKey)
[warning] 16-16: [UnorderedKey] The RESEND_API_KEY key should go before the SUPABASE_KEY key
(UnorderedKey)
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

🚀 Pull Request Description
Fixes # (#7 )
Summary
Replaced blank screens and
"Loading..."text with skeleton loaders to improve the loading experience across the app.Changes
Why
This makes loading states feel smoother and more responsive, especially on slower network connections.
Screenshots :
Dashboard

Analytics

Summary by CodeRabbit
New Features
Chores
✏️ Tip: You can customize this high-level summary in your review settings.